iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 10
0

<< 接續上篇

Method


自定義 Fragment

打開前面導入時建立好的 Frgament.kt 檔
會看到已經有一個建立好並繼承 Fragment Class 的 Class
並且已經 override 一個 onCreatView function

class BlankFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank_fragment, container, false)
    }
}

Fragment 的畫面就是在 onCreateView() 這個階段實例化並建立出來

因此可以在這個方法中載入我們設置的 Layout 做為 Fragment 的 View
也可在這方法中為 Fragment 中的按鈕設置監聽器

  • onCreateView (inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle)

     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
          val view = inflater.inflate(R.layout.main_fragment_1, container, false)
          view!!.frag_button.setOnClickListener { intent.intent(this.context, Activity_2()) }
          return view
     }
    
    • inflater:LayoutInflater 物件,用來實例化 Layout

      關於載入 Layout 實例化為 View 的方法可參考 Day 6 內容

    • container:Fragment 生成的依據,可以為 null

      • 用靜態載入時,container 是 null

        因為 Fragment 有放在 Activity 的 Layout 中,該 Layout 就是該 Fragment 的生成依據,因此可以依據此 Layout 生成並顯示 。

      • 用動態載入時,container 會是 FragmentTransaction add 方法傳入的 container,Fragment 會以這個 container 為依據生成並顯示。

        若使用 add 方法時沒傳入 container,container 會是 null,此時 Fragment 沒有生成的依據,LayoutParams 會是 null,Fragment 將顯示會為空的

        若不希望顯示為空的,可將 inflate 方法中的 ViewGroup 參數寫為你希望做為 container 的 View,Fragment 就會以這個 View 做為依據生成並顯示

    • savedInstanceState:先前的實例狀態,可以為 null。

      若非 null 則 Fragment 被再次建立時將依先前的實例狀態被重構出來

      !非重建先前的 View 狀態


FragmentManager

用來管理 Fragment

FragmentManager 會有一個自己的 Fragment 清單,將 Fragment 交給 FragmentManager 時該 Fragment 就會被加入清單中。

FragmentManager 會維護該清單,處理 Fragment 狀態在 back stack 中的進出,也可對 back stack 和 Fragment 的生命週期做監聽,或是透過 beginTransaction() 方法取得 FragmentTransaction 進而對 Fragment 做操作。

back stack:
類似於 Activity 的堆疊,Fragment 也有堆疊,就是這個 back stack。
Fragment 可透過 FragmentTransaction 中的方法將一系列操作存進 back stack 中,並可透過 FragmentManager 中的方法反執行存起來的那些操作,推出原先的 Fragment 狀態。
> back stack 參考資料

透過 getSupportFragmentManager() 方法取得 FragmentManager

val manager = supportFragmentManager

以下為一些簡單的 FragmentManager 方法

  • beginTransaction()

    val transaction = manager.beginTransaction()
    

    取得 FragmentTransaction,透過 FragmentTransaction 可對 Fragment 做許多操作。

    關於 FragmentTransaction 將在後面做詳細介紹

  • findFragmentById (id: Int)

    透過 id 取得 Fragment

    id:(靜態載入時)Layout 中為 Fragment 設置的 id,或是動態載入時 add 方法設置的 container id。

    若用同一個 container 載入多個不同的 Fragment,
    則找到的 Fragment 會是最後一個載入的 Fragment。

    val fragment_0 = findFragmentById(R.id.fragment_0)
    
  • findFragmentByTag (tag: String)

    透過 tag 取得 Fragment

    tag:(靜態載入時)Layout 中為 fragment 設置的 tag,或動態載入時為 fragment 加上的 tag。

    val fragment_0 = findFragmentByTag("fragment_0")
    
  • getBackStackEntryCount()

    取得目前在 back stack 中 Fragment 的個數(回傳 Int)

  • getFragments()

    取得目前 FragmentManager 的 Fragment 清單(回傳 List<Fragment>)

  • popBackStack()

    將 back stack 中最上層的 Fragment 狀態推出

    • 當 back stack 中不為空時,按返回鍵就會默認調用此方法,返回 stack 中最上層的 Fragment 狀態

    • 此方法會從 Fragment 生命週期的 onCreatView() 階段開始執行

    更多推出方法(如:推出指定狀態)
    請參考 官方文件 中的方法或 back stack 參考資料

其他 FragmentManager 方法請參考 官方文件

查看詳細 Code > GitHub

tags: Android Kotlin Fragment FragmentManager

接下來關於 FragmentTransaction 請參考 下篇 >>


上一篇
Android Kotlin 實作 Day 8:BottomNavigation(上)(Fragment 生命週期與載入)
下一篇
Android Kotlin 實作 Day 8:BottomNavigation(下)(FragmentTransaction + BottomNavigationView)
系列文
英國研究顯示,連續30天用Kotlin開發Android將有益於身心健康30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言